package day0523;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

//本案例实现生成几道加减乘除的题目，并返回做对的题目数量。
public class Test5 {
    public static void main(String[] args) throws InterruptedException {
        //1.调用exam方法并传入参数10和100(表示生成10道数学题， 数学题中的每个数都是小于100的随机数)
        //并用变量rs接收exam()方法的返回值(方法返回做对的题目数量)。
        //2.打印做对的题目数量
    }

    //3.定义exam方法，参数为int len和int range(len表示题目的总数量，range表示数学题中每个数的范围)
    //此方法返回用户做对的题目数量。
    private static int exam(int len, int  range) throws InterruptedException {
        //3.1.定义一个长度为len的String数组questions，用于存储len道数学题。
        String[]  questions=new String[len];
        //3.2.定义一个长度为len的int数组rightAnswer，用于存储正确答案。
        int[]  rightAnswer=new int[len];
        //3.3.定义一个长度为len的int数组userAnswer，用于存储用户回答的答案。
        int[]  userAnswer=new int[len];
        //3.4.定义一个Scanner变量s并赋值，定义Random ran变量并赋值。
        Scanner  s=new Scanner(System.in);
        Random ran=new Random();
        //3.5.定义一个变量count，用于记录做对的题目数量。
        int count=0;
        //3.6.定义for循环，执行len次(循环变量从0变化到len),用于出len道题，存入到questions数组中
        //并将答案存入到rightAnswer数组中。
        for (int i = 0; i < len; i++ ) {
            //3.6.1.调用generate()方法(传入随机数范围range)，并接收此方法返回的数组String[] quesAndAns
            // (存储String类型的数学题和String类型正确答案)
            //返回的数组中第0个元素存储数学题，第1个元素存储正确答案。
            String[] quesAndAns=generate(range);
            //3.6.2.在while循环条件中调用judgeIsEquals(questions, i,quesAndAns[0])
            // (调用judgeIsEquals()方法时传入所有的题questions，和当前需要生成的题的序号i，以及生成的这道题quesAndAns[0])
            // 用于判断questions数组中已经存储的题和generate()方法生成的题是否相同，
            //如果相同，就再调用generate(range)另一道题和答案，并继续判断，直到和questions数组元素都不相同为止。
            //(就将生成的题和答案存入到questions数组中，正确答案存入到rightAnswer数组中。)
            //(questions[i]是否等于quesAndAns[0])
            while(judgeIsEquals(questions, i,quesAndAns[0])){
                quesAndAns=generate(range);
            }
            //3.6.3.将生成的题quesAndAns[0]存入到questions数组中的第i位，正确答案quesAndAns[1]存入到rightAnswer数组的第i位。
            //注意： 需要用Integer.parseInt(quesAndAns[1])将生成的题对应的正确答案转化为int类型。
            questions[i]=quesAndAns[0];
            rightAnswer[i]=Integer.parseInt(quesAndAns[1]);
            //3.6.4.用输出语句先打印这道数学题questions[i]，  再用Scanner的nextInt()方法输入回答的答案，并将答案存入userAnswer数组的第i位。
            System.out.println(questions[i]);
            int ans=s.nextInt();//输入的答案
            userAnswer[i]=ans;//将输入的答案存入到userAnswer数组
            //3.6.5.用if判断rightAnswer[i]和userAnswer[i]是否相等，如果相等，count++。
            if(rightAnswer[i] == userAnswer[i]){
               count++;
            }
       }
       //3.7.返回做对的题目数量count。
       return count;
    }

    //3.6.1.定义generate()方法，用于生成一道数学题并计算出正确答案，将生成的数学题并计算出正确答案存入到 String[] rs数组中返回
    //参数为int range(表示生成数学题中每个数小于range的随机数)  。 方法的返回值类型为String[]
    private static String[] generate(int range) {
        //1.定义一个长度是2，元素类型是String的数组rs
        String[] rs=new String[2];
        //2.定义变量Random ran并赋值。
        Random ran=new Random();
        //3.定义一个int类型的变量n，并用Random的nextInt(5)生成0~4之间的随机数存入到n中(用于标识本次生成的是哪种题)
        int n=ran.nextInt(5);
        //4.定义两个int类型的变量num1和num2，并生成0~range之间的随机数存入到num1和num2中。(第二个num2的随机数要避开0)
        int num1=ran.nextInt(range);
        int num2=ran.nextInt(range)+1;
        //5.用switch语句判断n的值，并生成对应的数学题，将生成的数学题存入到rs数组的第0位， 对应的正确答案存入到rs数组的第1位。并返回rs数组。
        switch (n){
            case 0://case 如果n等于0：就用num1和num2拼成一道加法题，存入到rs数组的第0位， 对应的正确答案存入到rs数组的第1位。并返回rs数组。
                return rs;
            case 1://case 如果n等于1：就用num1和num2拼成一道减法题，存入到rs数组的第0位， 对应的正确答案存入到rs数组的第1位。并返回rs数组。
                return rs;
            case 2://case 如果n等于2：就用num1和num2拼成一道乘法题，存入到rs数组的第0位， 对应的正确答案存入到rs数组的第1位。并返回rs数组。
                return rs;
            case 3://case 如果n等于3：就用num1和num2拼成一道除法题，存入到rs数组的第0位， 对应的正确答案存入到rs数组的第1位。并返回rs数组。
                return rs;
            case 4://case 如果n等于4：就用num1和num2拼成一道求余数的题，存入到rs数组的第0位， 对应的正确答案存入到rs数组的第1位。并返回rs数组。
                return rs;
            default: return null;//如果n和和0 1 2 3 4 都不相等，就返回null。
        }
    }


    //3.6.2.judgeIsEquals()作用： 判断questions数组中已经存储的题和num1,num2构成的题ques是否相同
    //需要给此方法传入当前需要生成的题的序号num
    //(用于让循环变量j从0变化到num-1比较questions数组中这个范围内的题和当前生成的题ques是否相等)
    private static boolean judgeIsEquals(String[] questions, int num, String ques) {
        //1.定义一个for循环，循环变量j从0变化到num-1
        //(用于通过循环变量j，取出 [0到num-1] 范围内的题  <和当前生成的题ques比较是否相等>)
        for (int j = 0; j < num; j++) {
            //2.在for循环中，用if判断questions[j]和ques是否相等，如果相等，就返回true。
            if(ques .equals(questions[j])){
                return true;
            }
        }
        //3.如果for循环全部执行完毕，都没有返回true，则在这一行返回false。
        return false;
    }

}
